package innerclass

/**
 * 嵌套类与内部类
 */
class Outer {
    val value: Int = 1

    /**
     * 嵌套类，类似于java的public final 静态内部类
     */
    class Nester {
        //        fun value() = value//不持有外部类实例
        fun foo() = 2
    }

    /**
     * 内部类 public final 内部类
     */
    inner class InnerNester {
        fun foo() = value//持有外部类实例
    }

    /**
     * 定义接口
     */
    interface IMouse {
        fun mouseClicked()
        fun mouseEntered()
    }

    /**
     * 定义抽象类类
     */
    abstract class MouAdapter{
        abstract fun onClick()
    }

    fun setMouse(IMouse: IMouse) {
        IMouse.mouseClicked()
        IMouse.mouseEntered()
    }

    fun setMou(mouAdapter: MouAdapter){
        mouAdapter.onClick()
    }

}

fun main(args: Array<String>) {
    println(Outer.Nester().foo())//可以直接创建嵌套类实例
    println(Outer().InnerNester().foo())//必须先创建外部内实例，然后在创建内部类实例

    val outer = Outer()

    //匿名内部接口用法
    outer.setMouse(object : Outer.IMouse{
        override fun mouseEntered() {
            println("mouseEntered")
        }

        override fun mouseClicked() {
           println("mouseClicked")
        }
    })

    //匿名内部类用法
    outer.setMou(object:Outer.MouAdapter(){
        override fun onClick() {
            println("Mou onClick")
        }
    })


}

